package org.shj.spark.core

import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.storage.StorageLevel

/**
 * 当RDD会被复用时，我们通常就要使用持久化策略
 * 1. 持久化策略默认的是MEMORY_ONLY
 * 2. 如果内存有些吃紧，可以选择MEMORY_ONLY_SER
 * 3. 当我们的数据想要做一定的容错时，可以选择使用 _2
 * 4. 如果我们的中间结果RDD计算代价比较大，可以选择MEMORY_AND_DISK
 * 
 * MEMORY_ONLY -- 存不下就不存了
 * MEMORY_AND_DISK -- 内存不够用时，存在本地磁盘
 *
 */
object StorageLevelDemo {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("StorageLevelDemo").setMaster("local")
    val sc = new SparkContext(conf)
    sc.setLogLevel("WARN")
    
    val line = sc.textFile("F:\\download\\wordcntTest.txt")
    val words = line.flatMap(line => line.split("\\s+"))
    
    //val rdd = words.persist(StorageLevel.MEMORY_AND_DISK)
    
    //没有持久化，第一次操作
		var start = System.currentTimeMillis();
		var count = words.count();
		var end = System.currentTimeMillis();
		System.out.println("total: " + count + " words. Takes: " + (end - start));
    
    //没有持久化，第2次操作
		start = System.currentTimeMillis();
		count = words.count();
		end = System.currentTimeMillis();
		System.out.println("total: " + count + " words. Takes: " + (end - start));
        
    sc.stop()
  }
}